#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import yaml
from typing import List, Dict, Any, Optional
from serverconfig import ServerConfig
from mylogger import log_info_file, log_error_console, log_warning_console


class ConfigManager:
    """
    配置管理器类，用于加载和管理服务器配置
    
    该类负责从YAML配置文件中读取服务器配置信息，验证配置的有效性，
    并提供获取有效服务器配置列表的方法。
    """
    def __init__(self, config_file: str):
        """
        初始化配置管理器
        
        参数:
            config_file: 配置文件路径
        """
        self.config_file = config_file
        self.config_data: Optional[Dict[str, Any]] = None
        self.server_configs: List[ServerConfig] = []
    
    def load_config(self) -> bool:
        """
        加载并验证配置文件
        
        返回:
            bool: 配置文件是否加载成功
        """
        try:
            # 检查配置文件是否存在
            if not os.path.exists(self.config_file):
                log_error_console(f"配置文件不存在: {self.config_file}")
                return False
            
            # 读取配置文件
            with open(self.config_file, 'r', encoding='utf-8') as f:
                self.config_data = yaml.safe_load(f)
            
            # 检查配置是否为空
            if self.config_data is None:
                log_error_console(f"配置文件为空: {self.config_file}")
                return False
            
            # 检查是否包含hosts列表
            if 'hosts' not in self.config_data:
                log_error_console(f"配置文件中缺少 'hosts' 配置项: {self.config_file}")
                return False
            
            # 检查hosts是否为列表
            if not isinstance(self.config_data['hosts'], list):
                log_error_console(f"配置文件中的 'hosts' 必须是列表格式: {self.config_file}")
                return False
            
            # 检查hosts列表是否为空
            if not self.config_data['hosts']:
                log_warning_console(f"配置文件中的 'hosts' 列表为空: {self.config_file}")
                return False
            
            # 加载服务器配置
            self.server_configs = []
            for i, host_config in enumerate(self.config_data['hosts'], 1):
                # 确保每个主机配置是字典
                if not isinstance(host_config, dict):
                    log_error_console(f"配置文件中第 {i} 个主机配置必须是字典格式: {self.config_file}")
                    continue
                
                # 创建服务器配置对象
                server_config = ServerConfig(host_config)
                
                # 验证配置有效性
                if server_config.is_valid():
                    self.server_configs.append(server_config)
            
            # 检查是否有有效的服务器配置
            if not self.server_configs:
                log_error_console(f"配置文件中没有有效的服务器配置: {self.config_file}")
                return False
            
            log_info_file(f"成功加载配置文件: {self.config_file}")
            log_info_file(f"成功加载 {len(self.server_configs)} 个服务器配置")
            return True
            
        except yaml.YAMLError as e:
            log_error_console(f"解析配置文件失败: {self.config_file}, 错误: {str(e)}")
            return False
        except Exception as e:
            log_error_console(f"加载配置文件时发生错误: {self.config_file}, 错误: {str(e)}")
            return False
    
    def get_server_configs(self) -> List[ServerConfig]:
        """
        获取所有有效的服务器配置列表
        
        返回:
            List[ServerConfig]: 服务器配置对象列表
        """
        return self.server_configs
